package leetcode_200;

/**
 *@author 周杨
 *Candy_135 给糖果问题 
 *describe: 先从左到右扫描一遍，使得右边比左边得分高的小朋友糖果数比左边多。
			再从右到左扫描一遍，使得左边比右边得分高的小朋友糖果数比右边多。 AC 99%
 *2018年5月30日 下午2:53:30
 */
public class Candy_135 {

	public static void main(String[] args) {
		Candy_135 test=new Candy_135();
		int nums[]=new int[] {1,2,87,87,87,2,1};
		int nums1[]=new int[] {1,3,2,2,1};
		int nums2[]=new int[] {29,51,87,87,72,12};
		System.out.println(test.candy(nums2));

	}
	
	/**
	 * describe:判断当前数是否能决定  不能决定就标记 直到走到能决定的数返回遍历
	 * 可以做决定的条件  左边已经做了决定 比右边小或者相等 
	 * 2018年5月30日 下午1:33:45
	 */
	public int candy(int[] ratings) {
		int size = ratings.length;  
        if (size == 0) return -1;  
        if (size == 1) return 1;  
          
        int[] cans = new int[size];  //辅助空间
        cans[0] = 1;  
        //正向扫描一遍，如果右边的rating比左边高，那么右边的糖果数就比左边多一个，否则只给一个糖果  
        for (int i = 1; i < size; i++) {  
            if (ratings[i] > ratings[i - 1]) cans[i] = cans[i - 1] + 1;  
            else cans[i] = 1;  
        }  
        //反向扫描一遍，如果左边的rating比右边高，并且左边的糖果数比右边少，那么左边的糖果数应比右边多一  
        for (int i = size - 2; i >= 0; i--) {  
            if (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) {  
                cans[i] = cans[i + 1] + 1;  
            }  
        }  
          
        int ret = 0;  
        for (int i = 0; i < size; i++) {  
            ret += cans[i];  
        }  
          
        return ret;  
    }

}
